#ifndef __MY_SOCKET_H
#define __MY_SOCKET_H

//设置为1打印调试信息，0不输出调试信息
#define PRINT 0

#ifndef OPEN_MAX
#define OPEN_MAX 16
#endif

#define	DIR_MODE    00777
#define	FILE_MODE   00777

extern const unsigned int maxFileNameLen;   //最大文件长度
extern const unsigned int maxMessageSize;   //允许发送的最大消息长度
extern unsigned int current_connect;        //当前epoll服务的连接个数

/** 
 * @brief  创建套接字并与服务器建立TCP连接
 * @note   
 * @param  *ip: 
 * @param  port: 
 * @retval 成功返回套接字描述符.失败返回-1
 */
int connect_serv(const char const *ip,short port);
/**
 * @brief  创建TCP服务，默认本地ip
 * @note   
 * @param  port: 端口号
 * @retval 
 */
int creatTcpServer(short port);
/**
 * @brief  子程序退出处理函数，防止出现僵尸进程
 * @note   
 * @param  signo: 
 * @retval None
 */
void sig_chld(int signo);
/**
 * @brief   每次有新的连接就创建新的进程来执行这个函数
 *          函数将阻塞方式循环读这个句柄直到接收结束命令
 * @note   
 * @param  sockfd:  套接字句柄
 * @retval None
 */
int client_handle(int sockfd);
/** 
 * @brief  处理服务端接收的套接字数据
 * @note   
 * @param  cmd: 
 * @param  packet_len: 
 * @param  *buf: 
 * @retval 
 */
int delServerRecv(int sockfd,unsigned short cmd,unsigned int packet_len,char *buf);
/**
 * @brief 创建套接字并加入epoll监听
 * @param 
 *      servfd  作为结果参数，返回接听套接字描述符
 *      port    需要监听的端口号
 * @retval 
 *      成功返回 epoll描述符
 *      失败返回-1
 */
int creatEpollServer(int *servfd,short port);
/**
 * @brief   接收一个新的连接,加入epfd监听的队列
 * @param
 *      epfd    需要加入的epoll描述符
 *      serfd   监听描述符
 * @retval
 *      成功返回客户端描述符,失败返回-1
 */
int epollAccept(int epfd,int servfd);

//处理文件头信息，创建文件就完事了
void handle_file_head(char *buf);
//保存文件内容
void saveFileContent(char *buf,int len);

void Write(int fd, void *ptr, size_t nbytes);
ssize_t Read(int fd, void *ptr, size_t nbytes);
#endif // !__MY_SOCKET_H